package com.hzit.pay.web.service.impl;

import cn.hutool.core.lang.Snowflake;
import com.hzit.pay.web.mapper.PaySerialMapper;
import com.hzit.pay.web.model.PaySerial;
import com.hzit.pay.web.service.IpaySerialService;
import com.hzit.payweb.api.enums.PayStatusEnum;
import com.hzit.payweb.api.req.PayReq;
import com.hzit.payweb.api.resp.data.TradingData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class PaySerialServiceImpl implements IpaySerialService {


    @Autowired
    private PaySerialMapper paySerialMapper;


    @Override
    public  PaySerial  createPaySerial(PayReq payReq) {


        PaySerial paySerial =  paySerialMapper.queryByOrderId(payReq.getOrderId(),String.valueOf(PayStatusEnum.UNPAY.getCode()));

        if(!ObjectUtils.isEmpty(paySerial)){

            return null;
        }

        Snowflake snowflake = new Snowflake(10,8);

        paySerial = new PaySerial();
        String paySerialNo = snowflake.nextIdStr();
        paySerial.setPaySerialNo(paySerialNo);  //分布式的唯一： 1.jdk uuid：基于jdk的 2.雪花算法
        paySerial.setMchOrderId(payReq.getOrderId());
        paySerial.setPayAmt(new BigDecimal(payReq.getOrderAmt()));
        paySerial.setOrderSubject(payReq.getSubjetc());
        paySerial.setPayWay(payReq.getPayWay());
        paySerial.setCreateTime(new Date());
        paySerial.setCreateBy("system");
        paySerial.setStatus(String.valueOf(PayStatusEnum.UNPAY.getCode()));
        int rl = paySerialMapper.insertSelective(paySerial);

        if(rl != 1){
            return null;
        }
        return paySerial;

    }

    /**
     * 更新交易流水状态
     */
    @Override
    public PaySerial upDatePaySerial(String paySerialNo,String status) {

        PaySerial paySerial = paySerialMapper.queryBySerialNo(paySerialNo);

        if (!ObjectUtils.isEmpty(paySerial)) {
            return null;
        }

        PaySerial paySerial1 = new PaySerial();
        paySerial1.setId(paySerial.getId());
        paySerial1.setStatus(status);
        paySerial1.setUpdateTime(new Date());
        paySerialMapper.updateByPrimaryKey(paySerial1);

        return paySerial;

    }

    @Override
    public List<TradingData> queryTradingListByMchId(String mchId) {
        List<TradingData> tradingDataList = new ArrayList<TradingData>();

        List<PaySerial> paySerials = paySerialMapper.queryTrdingListByMchId(mchId);

        if(CollectionUtils.isEmpty(paySerials)){
            return tradingDataList;
        }

        for (PaySerial p:paySerials){

            TradingData tradingData = new TradingData();
            tradingData.setOutTradeNo(p.getPaySerialNo());
            tradingData.setTradeNo(p.getBankRespNo().toString());
            tradingDataList.add(tradingData);
        }
        return tradingDataList;
    }

    @Override
    public PaySerial queryTradingListByMchId(String mchOrderNo, String paySerialNo) {


        return null;
    }


    public static void main(String[] args) {
        Snowflake snowflake = new Snowflake(10,8);

       String id = snowflake.nextIdStr();

       System.out.println(id);


    }
}
